package com.ruoyi.utils;

import com.spire.doc.Document;
import com.spire.doc.documents.ImageType;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;

public class FileToPNG {
    /**
     * dpi越大转换后越清晰，相对转换速度越慢
     */
    private static final Integer DPI = 100;
    /**
     * 转换后的图片类型
     */
    private static final String IMG_TYPE = "png";

    /**
     * 将Word文档转换为图片
     *
     * @param inputPath 输入文件路径（支持doc/docx）
     * @param outputDir 输出目录
     * @return 生成的图片张数（等于文档页数），失败返回-1
     */
    public static int convertWordToImages(String inputPath, String outputDir) {
        try {
            // 加载Word文档
            Document document = new Document(inputPath);
            // 创建输出目录
            File outputFolder = new File(outputDir);
            if (!outputFolder.exists() && !outputFolder.mkdirs()) {
                throw new IOException("无法创建输出目录: " + outputDir);
            }
            Integer pageCount = document.getPageCount();
            BufferedImage image = document.saveToImages(0, ImageType.Bitmap);
            Path outputPath = Paths.get(outputDir, "page." + IMG_TYPE);
            ImageIO.write(image, IMG_TYPE, outputPath.toFile());
            return pageCount;
        } catch (Exception e) {
            return -1;
        }
    }

    /**
     * 将PDF文档转换为图片
     *
     * @param pdfPath        PDF文件路径
     * @param imageOutputDir 图片输出目录
     * @return 成功返回生成的图片张数，失败返回-1
     */
    public static int convertPdfToImages(String pdfPath, String imageOutputDir) {
        try (PDDocument document = PDDocument.load(new File(pdfPath))) {
            // 创建输出目录
            File outputDir = new File(imageOutputDir);
            if (!outputDir.exists() && !outputDir.mkdirs()) {
                throw new IOException("无法创建目录: " + imageOutputDir);
            }
            // 转换每一页
            PDFRenderer renderer = new PDFRenderer(document);
            BufferedImage image = renderer.renderImageWithDPI(0, DPI);
            Path outputPath = Paths.get(imageOutputDir, "page." + IMG_TYPE);
            ImageIO.write(image, IMG_TYPE, outputPath.toFile());
            return document.getNumberOfPages();
        } catch (Exception e) {
            return -1;
        }
    }
    /**
     * 判断文件类型并转换为图片
     *
     * @param savePath  输入文件路径
     * @param outputDir 输出目录
     * @return 生成的图片张数（等于文档页数），失败返回-1
     */
    public static int convertToImages(String savePath, String outputDir) {
        String extension = savePath.substring(savePath.lastIndexOf(".") + 1).toLowerCase();
        if (extension.equals("doc") || extension.equals("docx") || extension.equals("txt")) {
            return convertWordToImages(savePath, outputDir);
        } else if (extension.equals("pdf")) {
            return convertPdfToImages(savePath, outputDir);
        } else {
            return -1;
        }
    }

    /**
     * 将本地图片转换为 Base64 字符串
     *
     * @param imagePath 图片路径（如：/data/image.jpg）
     * @return Base64 编码字符串（失败返回 null）
     */
    public static String imageToBase64(String imagePath) {
        try {
            // 读取图片字节
            Path path = Paths.get(imagePath);
            byte[] imageBytes = Files.readAllBytes(path);

            // Base64 编码
            return Base64.getEncoder().encodeToString(imageBytes);
        } catch (Exception e) {
            return null;
        }
    }
}
